from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from django.core.cache import cache

from .models import Area
# Create your views here.


# 获取省数据
class ProvinceAreasView(View):

    def get(self, request):
        # 业务数据处理
        # TODO: 通读策略step1 —— 先读缓存
        province_list = cache.get('province_list') # 返回缓存数据 或 None

        if province_list is None:
            # 缓存未命中

            # TODO: 通读策略step2 —— 读mysql
            # (1)、通过模型类语法，查询出所有省Area对象 —— 一个查询集
            provinces = Area.objects.filter(parent=None) # 省级行政区的parent为None

            # (2)、把省Area对象，转化成包含name和id两个key的字典，放入列表中，用于构建响应参数
            province_list = []
            for province in provinces:
                # province是一个省行政区Area对象
                province_list.append({
                    'id': province.id,
                    'name': province.name
                })

            # TODO: 通读策略step3 —— 缓存回填
            cache.set('province_list', province_list, 3600) # 3600秒为缓存数据的有效期

        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'province_list': province_list
        })


# 获取子级行政区数据(市或区)
class SubAreasView(View):

    def get(self, request, pk):
        # 业务数据处理

        # TODO: 通读策略step1 —— 读缓存
        sub_data = cache.get('sub_area_%s'%pk)

        if sub_data is None:
            # 缓存未命中

            # TODO: 通读策略step2 —— 读mysql
            # (1)、通过模型类查询
            try:
                parent = Area.objects.get(pk=pk)
            except Area.DoesNotExist as e:
                return JsonResponse({'code': 400, 'errmsg': '不存在'})

            # (2)、把模型类对象，转化成字典形式用于返回
            # 关联查询：给定父级(主)行政区对象，查询出其子级(从)行政区对象们
            subs = parent.subs.all() # 查询集，里面都是子级别行政区Area对象
            subs_list = []
            for sub in subs:
                # sub是每一个Area对象
                subs_list.append({
                    'id': sub.id,
                    'name': sub.name
                })
            # 热门数据 —— 某一个省的子级行政区数据
            sub_data = {
                'id': parent.id,
                'name': parent.name,
                'subs': subs_list
            }

            # TODO: 通读策略step3 —— 回填缓存
            # 如下，表示缓存数据是id为110000省的子级行政区数据
            # set  sub_area_110000  {'id': parent.id,'name': parent.name,'subs': subs_list}
            cache.set('sub_area_%s'%pk, sub_data, 3600) # 3600秒为缓存数据的有效期

        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': sub_data
        })
